/*
定义变量时带var和不带var的区别

在项目中，如果目的是创建变量，最好不要省略var(不带var会被当做window.a)

带var是声明变量（顺道在全局下定义一个属性）
在当前作用域中声明一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a(操作window.a同时也会改变var a的值)。
*/

/*
//=>变量提升：
var a; <=> window.a=undefined;
console.log(a); //->undefined
var a = 12; //定义了一个变量a并且将12这个值赋给了它，另外顺道在 window.a=12
console.log(a); //->12
//↓window下多一个属性名叫a的属性(不是变量a)
console.log(window.a); //->window['a'] 在”全局作用域“中，我们声明一个变量相当于给全局对象window增加了一个属性名
*/

var num = 1 //window.num = 1
    , obj = {
    num: 2
    , fn: (function (num) { //私有1 -> 3 -> 4 -> 5
        this.num *= 2; //window.num = 6
        num += 2; //私有3

        return function(){
            this.num *= 3; //window.nm=18  //this.num = 6;
            num++; //4 //5
            console.log(num); //4 //5
        }
    })(num) //1
};

var fn = obj.fn;
fn(); //4
obj.fn(); //5
console.log(num, obj.num); //1 6 如果是浏览器中就是 66
// console.log(window.num); //6

/*
不带var是全局属性

在全局作用域中，如果不带var,仅仅只是给全局对象设置了一个新的属性名(等同于window.a=xx)
*/

// console.log(a); //=>报错 Uncaught ReferenceError:a is not defined

//先看是不是变量，如果没有，在window下看有没有这个属性，如果都没有，就会报错（浏览器会认为你在忽悠它）
//如果输出的window.a，不会报错，只会输出undefined

/*
a = 12; //<=>window.a = 12
console.log(a); //=>12
console.log(window.a); //=>12
*/


function fn(){
    a = 12; //window.a
    console.log(a);//12
}

fn();
console.log(a); //12